#!/bin/bash

### BEGIN INIT INFO
# Provides:          ps10
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Should-Start:      mahr_updater
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: PS10/M310 machine control
### END INIT INFO

# /etc/init.d/ps10.sh
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
PIDDIR=/var/run
LOGDIR=/var/log/Mahr
PS10HOME=/opt/Mahr/ps10
PS10DATA=/var/opt/Mahr/ps10

start() {
    echo -n "Starting ps10: checking for updates"
    # get the current BSP-Base Version
    BSP_VERSION=$(cat /etc/os-release | grep "BUILD_ID" | sed -e 's/BUILD_ID\=\"v\(.*\...-..\).*/\1/')
    echo "/ect/init.d/ps10: (0) current bsp version is $BSP_VERSION" >> /var/log/Mahr/mahr-log.txt
    # see if we have updates for that version
    if [ -e /opt/Mahr/ps10/BSP_$BSP_VERSION ] ; then
        echo "/ect/init.d/ps10: (1) /opt/Mahr/ps10/BSP_$BSP_VERSION exists" >> /var/log/Mahr/mahr-log.txt
        ## check if dpkg is still running
        i=0
        while fuser /var/lib/dpkg/lock >/dev/null 2>&1 ; do
            echo "Waiting for dpkg to finish..." >> /var/log/Mahr/mahr-log.txt
            sleep 1
            i=i+1
            if [ $i -ge 60 ] ; then
              echo "Waiting for dpkg took too long. Let's reboot!" >> /var/log/Mahr/mahr-log.txt
              reboot
            fi
        done

        # install the bsp updates
        for update in /opt/Mahr/ps10/BSP_$BSP_VERSION/*.gpg
        do
          echo "installing $update" >> /var/log/Mahr/mahr-log.txt
          sh /usr/bin/install_marecon.sh $update || true
          echo "$update installed" >> /var/log/Mahr/mahr-log.txt
        done

        # remove all remaining BSP-Update folders
        rm -rf /opt/Mahr/ps10/BSP_*
        cd /opt/Mahr/ps10/
        echo "/ect/init.d/ps10: (2) current content of /opt/Mahr/ps10 is" >> /var/log/Mahr/mahr-log.txt
        ls >> /var/log/Mahr/mahr-log.txt
    fi

    local REBOOT_FILE=/var/run/reboot-required
    if [ -f $REBOOT_FILE ]; then
      echo "Reboot required" >> /var/log/Mahr/mahr-log.txt
      logger "$REBOOT_FILE present. Rebooting."
      reboot
    fi

    if [ -e $PIDDIR/ps10tool.pid -a -e $PIDDIR/ps10_app.pid ]; then
	    logger "init.d/ps10: already running"
	    exit 0
    fi

    # load BSP hooks
    if [ -x /usr/local/bin/mahr_platform_init.sh ]; then
        /usr/local/bin/mahr_platform_init.sh
    fi

    # adjust psplash symlink when needed
    # A = 'PS10', 'ST2', 'M310', 'M410' or ''
    A=$(sed -nr "/^\[general\]/,/^\[/{ :l /^machine[ ]*=/ { s/.*=[ ]*//; p; q;}; n; b l;}" /var/opt/Mahr/ps10/ps10tool.ini)
    if [ "_$A" == "_" ]; then
        A=PS10
    fi
    # B = 'PS10', 'ST2', 'M310', 'M410' or 'psplash'
    B=$(readlink -f /usr/bin/psplash | cut -d '_' -f2)
    if [ "_$A" != "_$B" ]; then
        ln -sf /opt/Mahr/ps10/psplash_${A} /usr/bin/psplash
        sync
    fi

    test -d /var/data/ps10/results || mkdir -p /var/data/ps10/results
    test -d ${PS10DATA}/results && mv ${PS10DATA}/results ${PS10DATA}/results.old
    ln -sf /var/data/ps10/results ${PS10DATA}

    cd ${PS10HOME}

    ./create_backing_storage.sh
    ./usb_gadget.sh start
    # now ps10tool may toggle mass_storage via "./mass_storage.sh on|off"
    # current state is now "off" -> mass storage invisible from PC

    # create core files
    if [ -d ${PS10DATA}/results/coredump ]; then
        sysctl -w kernel.core_pattern="${PS10DATA}/results/coredump/core_%e.%p"
    else
        sysctl -w kernel.core_pattern='/tmp/core_%e.%p'
    fi
    ulimit -c unlimited

    export SEGFAULT_SIGNALS="all"
    /usr/sbin/start-stop-daemon --start --background \
	--make-pidfile --pidfile $PIDDIR/ps10tool.pid --chdir ${PS10HOME} \
	--startas /bin/sh \
	-- -c "exec ${PS10HOME}/ps10tool -r -T0 >> $LOGDIR/ps10tool.log 2>&1"

    if [ $? -eq 0 ]; then
	echo -n "ps10tool "
    else
	echo "failed!"
    fi

    (
        /usr/sbin/start-stop-daemon --start --make-pidfile \
	        --pidfile $PIDDIR/ps10_app.pid --chdir ${PS10HOME} \
	        --exec ${PS10HOME}/ps10_app -- -platform linuxfb:fb=/dev/fb0

        if [ ! -e /etc/no_poweroff -a ! -e /tmp/ps10_stop ]; then
            echo "Shutting down due to sudden ps10_app exit"
            ${PS10HOME}/mass_storage.sh off
            halt -p
        fi
        rm -f /tmp/ps10_stop
    ) &

    if [ $? -eq 0 ]; then
	echo "ps10_app."
    else
	echo "failed!"
    fi
}

stop() {
    echo "Stopping ps10"

    touch /tmp/ps10_stop

    /usr/sbin/start-stop-daemon --stop --retry INT/20/KILL/5 \
	--pidfile $PIDDIR/ps10_app.pid ps10_app
    if [ ! $? -eq 0 ]; then
	    echo "failed!"
    fi

    /usr/sbin/start-stop-daemon --stop --retry INT/20/KILL/5 \
	--pidfile $PIDDIR/ps10tool.pid ps10tool
    if [ ! $? -eq 0 ]; then
	    echo "failed!"
    fi

    rm -f $PIDDIR/ps10_app.pid $PIDDIR/ps10tool.pid

    ${PS10HOME}/mass_storage.sh off
    ${PS10HOME}/usb_gadget.sh stop

    killall marlog_server
}


case "$1" in
    start)
	start
	;;

    stop)
	stop
	;;

    restart|force-reload)
	stop
	start
	;;
    *)
	echo "Usage: $0 {start|stop|restart|force-reload}"
	exit 1
	;;
esac

exit 0
